package com.study.blogsearchconsumer.rabbitMQ;

import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @author yana
 */
@Component
public class MqConsumer {

    @RabbitListener(queues = "yanaDirectQueue0")
    public void yanaDirectQueue0OnMessage(String content) { System.out.println("yanaDirectQueue0:" + content);}

    @RabbitListener(queues = "yanaTopicQueue1")
    public void yanaTopicQueueOnMessage1(String content) {
        System.out.println("yanaTopicQueue1:" + content);
    }

    @RabbitListener(queues = "yanaTopicQueue2")
    public void yanaTopicQueueOnMessage2(String content) {
        System.out.println("yanaTopicQueue2:" + content);
    }

    @RabbitListener(queues = "yanaFanoutQueue3")
    public void yanaFanoutQueueOnMessage3(String content) {
        System.out.println("yanaFanoutQueue3:" + content);
    }

    @RabbitListener(queues = "yanaFanoutQueue4")
    public void yanaFanoutQueueOnMessage4(String content) {
        System.out.println("yanaFanoutQueue4:" + content);
    }
}
/**
 * 消费者配置：
 *
 *  listener:
 *       simple:
 *         retry:
 *         ####开启消费者重试
 *           enabled: true
 *          ####最大重试次数（默认无数次）
 *           max-attempts: 5
 *         ####重试间隔次数
 *           initial-interval: 3000
 *
 *
 * json转换异常，将消息从消息队列中移除
 * try {
 *             logisticsOrderData = JSON.parseObject(content, LogisticsOrderData.class);
 *         } catch (Exception e) {
 *             log.error("process parse json error, ", e);
 *             channel.basicNack(tag, false, false);
 *             return;
 *         }
 *
 *
 * 远程调用异常（例如返回null） 一定次数内，不移除消息并更新数据库中的重试次数。超过一定次数的话，再从队列中移除。手工或者任务读取数据库的记录做补偿
 *  VException exception = exceptionService.selectVException(type,content);
 *         if(exception != null){
 *             Integer count = exception.getCount();
 *             if(count > 5){
 *                 channel.basicNack(tag, false, false);
 *
 *             }else{
 *                 count = count + 1;
 *                 record.setCount(count);
 *                 exceptionService.updateException(record);
 *                 Thread.sleep(240000);
 *                 channel.basicNack(tag, false, true);
 *             }
 *         }else{
 *             exceptionService.saveException(record);
 *             Thread.sleep(240000);
 *             channel.basicNack(tag, false, true);
 *         }
 */

/**
 * 消费者如果保证消息幂等性，不被重复消费
 *产生原因:网络延迟传输中，或者消费出现异常或者是消费延迟，会造成进行MQ重试进行重试补偿机制，在重试过程中，可能会造成重复消费。
 *
 *对于强制不可重复的业务：
 *      执行业务后，要讲执行记录持久化到redis（不可靠）或者数据库
 *      每次执行业务前先查询数据库是否已经存在记录
 */
